// 改造下面的代码，使之输出0 - 9，写出你能想到的所有解法。考查闭包
// 源代码
// for (var i = 0; i< 10; i++){
// 	setTimeout(() => {
// 		console.log(i);
//     }, 1000)
// }

/* 展示了 JavaScript 中 var 和 let 关键字在循环中的不同行为,var没有块级作用域。相当于在全局中声明都是同一个i
let 关键字声明的是块作用域的变量。这意味着每次循环迭代时，i 的值都是新的，并且对于 setTimeout 中的每个回调函数都是独立的。
*/


// 1、改var变成let 每次都会重新声明i，创造新的作用域
// 利用 let 变量的特性 — 在每一次 for 循环的过程中，let 声明的变量会在当前的块级作用域里面（for 循环的 body 体，也即两个花括号之间的内容区域）创建一个文法环境（Lexical Environment），该环境里面包括了当前 for 循环过程中的 i
// for (let i = 0; i< 10; i++){
// 	setTimeout(() => {
// 		console.log(i);
//     }, 1000)
// }
// 等价于
// for (let i = 0; i < 10; i++) {
//     let _i = i;// const _i = i;
//     setTimeout(() => {
//       console.log(_i);
//     }, 1000)
//   }
// 2、在里面包装个立即执行函数 传参数 这样就会立即执行
// for (var i = 0; i< 10; i++){
// 	(function(j){
//         setTimeout(() => {
//             console.log(j);
//         }, 1000)
//     })(i)
// }

// 3、包裹一个函数 立即调用
for(var i=0;i<10;i++){
    function a(i) {
    setTimeout(function timer() {
        console.log(i);
    }, 1000)
}//每次都会生成一个新的作用域
a(i)
}

